#pragma once
#include"Common.hpp"

/*匹配队列: 
            1.设计一个匹配队列
            2.根据段位的数量创建同等数量的线程-对应一个个队列*/

template<class T>
class MatchQueue
{
private:
    //对战匹配队列
    std::list<T> _list;
    std::mutex _mtx;
    std::condition_variable _con;
public:
    MatchQueue()
    {}
    //生产
    void Push(const T& in)
    {
        std::unique_lock<std::mutex> lock(_mtx);
        _list.push_back(in);
        _con.notify_all(); 
    }
    bool Empty()
    {
        std::unique_lock<std::mutex> lock(_mtx);
        return _list.empty();
    }
    //消费
    bool Pop(T& out)
    {
        //外部判断队列玩家是否 >= 2
        std::unique_lock<std::mutex> lock(_mtx);
        if(_list.size() == 0)
        {
            return false;//外部判断如果获取用户时失败，就放弃后续所有操作，重置
        }
        out = _list.front();
        _list.pop_front();
        return true;
    }
    //等待条件满足
    void Wait()
    {
        std::unique_lock<std::mutex> lock(_mtx);
        _con.wait(lock);
    }
    int Size()
    {
        std::unique_lock<std::mutex> lock(_mtx);
        return _list.size();
    }
    //移除用户信息
    void Remove(const T& in)
    {
         std::unique_lock<std::mutex> lock(_mtx);
        _list.remove(in);
    }
    ~MatchQueue()
    {}
};